package ar.com.age.distribuidora.presentacion.controller;

import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.Cheque;
import ar.com.age.distribuidora.dominio.Cliente;
import ar.com.age.distribuidora.dominio.EntregaEfectivo;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class EntregaEfectivoBean {

	private String codigoRegistrar;
	
	private String estadoRegistrar;
	
	private Date fechaEntregaRegistrar;
	
	private Cliente clienteSeleccionadoRegistrar;
	
	private String montoRegistrar;
	
	private List<Cheque> cheques;
	
	private List<Cliente> clientes;
	
	private List<EntregaEfectivo> entregas;
	
	private EntregaEfectivo entregaSeleccionado;  
    
	private EntregaEfectivo entregaSeleccionadoDetalles;
	
	private String codigoBuscar;
    
	private Date fechaDesdeBuscar;
	
	private Date fechaHastaBuscar;
	
	private String clienteBuscar;
	
	private String estadoBuscar;

	private String montoEditar;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;
	
	private Cliente clienteAux;
	
	private String nombreCliente;
	
    
	public EntregaEfectivoBean() {
		
		ValidadorTipoUsuario.validarEmpleadoVenta();

		this.clientes = ServiceLocator.getClienteService().buscarTodos();

		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		this.panelBuscarVisibilidad = false;
		
	}
	
	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public Cliente getClienteAux() {
		return clienteAux;
	}

	public void setClienteAux(Cliente clienteAux) {
		this.clienteAux = clienteAux;
	}

	public String getNombreCliente() {
		return nombreCliente;
	}

	public void setNombreCliente(String nombreCliente) {
		this.nombreCliente = nombreCliente;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public String getEstadoRegistrar() {
		return estadoRegistrar;
	}

	public void setEstadoRegistrar(String estadoRegistrar) {
		this.estadoRegistrar = estadoRegistrar;
	}

	public Date getFechaEntregaRegistrar() {
		return fechaEntregaRegistrar;
	}

	public void setFechaEntregaRegistrar(Date fechaEntregaRegistrar) {
		this.fechaEntregaRegistrar = fechaEntregaRegistrar;
	}

	public String getMontoRegistrar() {
		return montoRegistrar;
	}

	public void setMontoRegistrar(String montoRegistrar) {
		this.montoRegistrar = montoRegistrar;
	}

	public Cliente getClienteSeleccionadoRegistrar() {
		return clienteSeleccionadoRegistrar;
	}

	public void setClienteSeleccionadoRegistrar(Cliente clienteSeleccionadoRegistrar) {
		this.clienteSeleccionadoRegistrar = clienteSeleccionadoRegistrar;
	}

	public List<Cheque> getCheques() {
		return cheques;
	}

	public void setCheques(List<Cheque> cheques) {
		this.cheques = cheques;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public List<EntregaEfectivo> getEntregas() {
		return entregas;
	}

	public void setEntregas(List<EntregaEfectivo> entregas) {
		this.entregas = entregas;
	}

	public EntregaEfectivo getEntregaSeleccionado() {
		return entregaSeleccionado;
	}

	public void setEntregaSeleccionado(EntregaEfectivo entregaSeleccionado) {
		this.entregaSeleccionado = entregaSeleccionado;
	}

	public EntregaEfectivo getEntregaSeleccionadoDetalles() {
		return entregaSeleccionadoDetalles;
	}

	public void setEntregaSeleccionadoDetalles(
			EntregaEfectivo entregaSeleccionadoDetalles) {
		this.entregaSeleccionadoDetalles = entregaSeleccionadoDetalles;
	}

	public String getMontoEditar() {
		return montoEditar;
	}

	public void setMontoEditar(String montoEditar) {
		this.montoEditar = montoEditar;
	}

	public Date getFechaDesdeBuscar() {
		return fechaDesdeBuscar;
	}

	public void setFechaDesdeBuscar(Date fechaDesdeBuscar) {
		this.fechaDesdeBuscar = fechaDesdeBuscar;
	}

	public Date getFechaHastaBuscar() {
		return fechaHastaBuscar;
	}

	public void setFechaHastaBuscar(Date fechaHastaBuscar) {
		this.fechaHastaBuscar = fechaHastaBuscar;
	}

	public String getClienteBuscar() {
		return clienteBuscar;
	}

	public void setClienteBuscar(String clienteBuscar) {
		this.clienteBuscar = clienteBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public String getCodigoRegistrar() {
		return codigoRegistrar;
	}

	public void setCodigoRegistrar(String codigoRegistrar) {
		this.codigoRegistrar = codigoRegistrar;
	}

	public String getCodigoBuscar() {
		return codigoBuscar;
	}

	public void setCodigoBuscar(String codigoBuscar) {
		this.codigoBuscar = codigoBuscar;
	}

	// Metodos del Bean

	public String registrarEntregaEfectivo() {
		
		EntregaEfectivo entrega = new EntregaEfectivo();
		entrega.setCliente(clienteSeleccionadoRegistrar);
		entrega.setEstado(estadoRegistrar);
		entrega.setFechaEntrega(fechaEntregaRegistrar);
		entrega.setMontoActual(Double.parseDouble(montoRegistrar));
		entrega.setMontoInicial(Double.parseDouble(montoRegistrar));
		entrega.setCodigo(codigoRegistrar);
		
		ServiceLocator.getEntregaService().crearOEditarEntregaEfectivo(entrega);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		fechaEntregaRegistrar = null;
		clienteSeleccionadoRegistrar = null;
		estadoRegistrar = null;
		montoRegistrar = null;
		codigoRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarEntregaEfectivo() {
		
		if (this.entregaSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Entrega de Efectivo",  "Entrega de efectivo editada con exito.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
	        
	        entregaSeleccionado.setMontoActual(Double.parseDouble(montoEditar));
	        entregaSeleccionado.setMontoInicial(Double.parseDouble(montoEditar));
	        
	        if (this.entregaSeleccionado.getCliente() == null) {
	        	this.entregaSeleccionado.setCliente(this.clienteAux);
			}
	        
			ServiceLocator.getEntregaService().crearOEditarEntregaEfectivo(this.entregaSeleccionado);
			
			this.clienteAux = null;
			this.nombreCliente = null;
			this.clientes = ServiceLocator.getClienteService().buscarTodos();
			
			this.entregaSeleccionado = null;
			this.montoEditar = null;
			
			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;
		 
			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Entrega Efectivo",  "No se ha seleccionado una entrega.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarEntregaEfectivo() {
		
		if (this.entregaSeleccionado != null) {
			
			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			montoEditar = String.valueOf(entregaSeleccionado.getMontoInicial());
			
			this.clienteAux = this.entregaSeleccionado.getCliente();
			this.nombreCliente = this.entregaSeleccionado.getCliente().getCodigo();
			
			for(int i = 0; i < clientes.size(); i++){
				if (clienteAux.getCodigo().equals(clientes.get(i).getCodigo())) {
					clientes.remove(i);
				}
			}
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarEntregaEfectivo() {
		
		if (this.entregaSeleccionado != null) {

			try {
				ServiceLocator.getEntregaService().eliminarEntregaEfectivo(this.entregaSeleccionado);
			} catch (Exception e) {

				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
				RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}

			this.entregaSeleccionado = null;

			this.entregas = ServiceLocator.getEntregaService().buscarEntregaEfectivo(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, clienteBuscar);
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarEntregaEfectivo() {
		
			
		this.entregas = ServiceLocator.getEntregaService().buscarEntregaEfectivo(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, clienteBuscar);

		if (this.entregas != null && !this.entregas.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		this.entregas = ServiceLocator.getEntregaService().buscarEntregaEfectivo(codigoBuscar, estadoBuscar, fechaDesdeBuscar, fechaHastaBuscar, clienteBuscar);
	}
	
}
